#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "Drivers/nvs_drv.h"

/**
 * @brief 从指定的NVS命名空间和键中读取字符串
 * @param namespace 为要打开的 NVS 命名空间
 * @param key 为要读取的字符串的键
 * @param buf 为存储读取的字符串
 * @param maxlen 为存储读取的字符串的最大长度
 * @return 
 *    - ESP_OK: Success
 *    - Others: Error
 */
esp_err_t read_nvs_space(char *namespace, char* key, char *buf, size_t maxlen)
{
    nvs_handle_t nvs_handle;
    esp_err_t ret_val = ESP_FAIL;
    size_t required_size = 0;
    ESP_ERROR_CHECK(nvs_open(namespace, NVS_READWRITE, &nvs_handle));
    ret_val = nvs_get_str(nvs_handle, key, NULL, &required_size);
    if (ret_val == ESP_OK && required_size <= maxlen)
    {
        nvs_get_str(nvs_handle, key, buf, &required_size);
    }
    else{
        required_size = 0;
    }
        
    nvs_close(nvs_handle);
    return ret_val;
}

/**
 * @brief 将字符串值写入指定的NVS命名空间和键。
 * @param namespace 为要打开的 NVS 命名空间
 * @param key 为存储在 NVS 中的字符串的键。
 * @param str 是要存储在 NVS 中的字符串值。
 * @return 
 *    - ESP_OK: Success
 *    - Others: Error
 */
esp_err_t write_nvs_space(char *namespace, char* key, char *str)
{
    nvs_handle_t nvs_handle;
    esp_err_t ret;
    ESP_ERROR_CHECK(nvs_open(namespace, NVS_READWRITE, &nvs_handle));

    ret = nvs_set_str(nvs_handle, key, str);
    nvs_commit(nvs_handle);
    nvs_close(nvs_handle);
    return ret;
}

/**
 * @brief 在指定的NVS命名空间中擦除key对应的存储值
 * @param namespace 为要打开的 NVS 命名空间
 * @param key 为要擦除的字符串的键
 * @return 
 *    - ESP_OK: Success
 *    - Others: Error
 */
esp_err_t erase_nvs_space(char *namespace, char* key)
{
    nvs_handle_t nvs_handle;
    ESP_ERROR_CHECK(nvs_open(namespace, NVS_READWRITE, &nvs_handle));
    return nvs_erase_key(nvs_handle, key);
}